using System.ComponentModel.DataAnnotations;
using System.Text.Json;
using Microsoft.Extensions.Logging;
using UniversalAdminSystem.Infrastructure.Configs;

namespace UniversalAdminSystem.Infrastructure.Services;

public sealed class SystemPermissionConfigLoader(ILogger<SystemPermissionConfigLoader> logger)
{
    private readonly ILogger<SystemPermissionConfigLoader> _logger = logger;

    /// <summary>
    /// json反序列化规则
    /// </summary>
    private static readonly JsonSerializerOptions SerializerOptions = new()
    {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // 属性名使用驼峰命名
        AllowTrailingCommas = true, // 允许 JSON 文件中存在尾随逗号
        ReadCommentHandling = JsonCommentHandling.Skip, // 跳过注释
    };

    /// <summary>
    /// 异步加载配置文件
    /// </summary>
    /// <param name="filePath"></param>
    /// <returns></returns>
    /// <exception cref="FileNotFoundException"></exception>
    /// <exception cref="InvalidOperationException"></exception>
    public async Task<IReadOnlyCollection<SystemPermissionConfig>> LoadFromFileAsync(string filePath)
    {
        // 文件存在性检查
        if (!File.Exists(filePath))
        {
            _logger.LogError("系统权限配置文件未找到", [filePath]);
            throw new FileNotFoundException("系统权限配置文件未找到", filePath);
        }

        // 读取并解析JSON
        try
        {
            await using var stream = File.OpenRead(filePath); // 打开文件流
            var configRoot = await JsonSerializer.DeserializeAsync<SystemPermissionConfigRoot>( // 开始异步JSON反序列化，完成并关闭文件流
                stream,
                SerializerOptions
            );

            if (configRoot?.Permissions is null || configRoot.Permissions.Count == 0)
            {
                _logger.LogWarning("配置文件中未找到有效的系统权限", [filePath]);
                return [];
            }

            // 校验系统权限配置集合
            ValidateConfigs(configRoot.Permissions);

            return configRoot.Permissions;
        }
        catch (JsonException ex)
        {
            _logger.LogError(ex, "JSON解析错误", [filePath]);
            throw new InvalidOperationException("JSON 结构与目标类型不匹配", ex);
        }
    }

    /// <summary>
    /// 校验配置集合的有效性
    /// </summary>
    /// <param name="configs"></param>
    private void ValidateConfigs(IEnumerable<SystemPermissionConfig> configs)
    {
        foreach (var config in configs)
        {
            if (string.IsNullOrWhiteSpace(config.Resource))
            {
                _logger.LogWarning("权限配置缺少资源", [config]);
            }

            // 利用 System.ComponentModel.DataAnnotations 的验证
            var context = new ValidationContext(config);
            Validator.ValidateObject(config, context, validateAllProperties: true);
        }
    }
}